/*
 ============================================================================
 Page	     : 433
 Name        : randbin.c
 Date	     : 20210407
 Author      : Hbue 18060333
 Copyright   : Your copyright notice
 Description : 用二进制I/O进行随机访问
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#define ARSIZE 1000

int main(void)
{
	double numbers[ARSIZE];
	double value = 0;
	const char *file = "numbers.dat";
	int i= 0;
	long pos = 0;
	FILE *iofile = NULL;

	// 创建一组double类型的值
	for(i = 0; i < ARSIZE; i++)
	{
		numbers[i] = 100.0 * i + 1.0 / (i + 1);
	}
	// 尝试打开文件
	if((iofile = fopen(file,"wb")) == NULL)
	{
		fprintf(stderr, "Could not open %s for output.\n", file);
		exit(EXIT_FAILURE);
	}

	// 以二进制格式把数组写入文件
	fwrite(numbers, sizeof(double), ARSIZE, iofile);
	fclose(iofile);
	if((iofile = fopen(file,"rb")) == NULL)
	{
		fprintf(stderr, "Could not open %s for random access.\n", file);
		exit(EXIT_FAILURE);
	}

	// 从文件中读取选定的内容
	printf("Enter an index in the range 0~%d.\n", ARSIZE - 1);
	while(scanf("%d", &i) == i && i >= 0 && i < ARSIZE)
	{
		pos = (long)i * sizeof(double);			// 计算偏移量
		fseek(iofile, pos, SEEK_SET);			// 定位到此处
		fread(&value, sizeof(double), 1, iofile);
		printf("The value there is %f.\n", value);
		printf("Next index (out of range ot quit):\n");
	}

	// 完成
	fclose(iofile);
	puts("Bye");

	return 0;
}

